package prop;
import java.util.Vector;

    /**Autor: Pedro Redondo Quesada **46471772R**/
public class Texto {
    /*final private String[] FNC= {"a","al","ante","bajo","cabe","con","contra","de","del","desde",
    "en","entre","hacia","hasta","para","por","según","sin","so","sobre","tras","el","los","la","las","don",
    "doña","este","esta","esto","ese","esa","eso","aquel","aquella","aquello","mio","mia","tuyo","tuya",
    "suyo","suya","nuestro","nuestra","vuestro","vuestra","mi","tu","su","nos","vos","yo","tu","ella",
    "nosotros","vosotros","ellos","usted","ustedes","me","te","se","mucho","mucha","muchos","muchas",
    "poco","poca","pocos","pocas","algun","alguna","alguno","algo","alguien","todo","toda","todos",
    "todas", "nada","nadie","bastante","bastantes","demasiado","demasiada","demasiados","demasiadas",
    "suficiente","suficientes","uno","dos","tres","cuatro","cinco","seis","siete","ocho","nueve","diez",
    "once","doce","trece","catorce","quince","dieciseis","diecisiete","dieciocho","diecinueve","veinte",
    "cien", "cientos","centenar", "mil","miles","millar","millon","millones","primero","segundo","tercero",
    "cuarto","quinto","sexto","septimo","octavo","noveno","decimo","primera","segunda","tercera",
    "cuarta","quinta","sexta","septima","octava","novena","decima","y","e","ni","o","u","mas","menos",
    "pero","le","lo"};*/
    private DiccionarioPalabras FNC;      
    private String texto;
    private int indice;
    private Vector<String> listadopalabras;
    private Vector<String> listadobiwords;

//Constructoras
    
    /*INUTIL
     public Texto(){
    //{Pre: cierto}
    //{Post: genera un texto vacío}
    texto="";
    indice=0;
    this.listadopalabras=new Vector<String>(0,1);
    this.listadobiwords=new Vector<String>(0,1);
    this.FNC=new DiccionarioPalabras();
    }*/

    public Texto(String txt,DiccionarioPalabras D){
    //{Pre: txt no es vacio}
    //{Post: lee el String txt y genera un Texto}
        if (!txt.equals("") && !txt.equals(" ")){
            this.texto=" "+txt;
            this.indice=0;
            this.listadopalabras=new Vector<String>(0,1);
            this.listadobiwords=new Vector<String>(0,1);
            this.FNC=D;
            this.subsNoFuncional();
            this.tknFuncional();
            this.texto=txt;   
        }
     }
    
//Consultoras
    private void isBiword(){
    //{Pre: cierto}
    //{Post:anade al listado si el String es una concatenación válida de palabras
    // y modifica la posicion de indice al final de la secuancia de Biword}
      boolean b=true;
        String aux="";
        String fin="";
        int i=this.indice;
        int contpal=0;
        while(i<this.texto.length() && b){
            if (this.texto.charAt(i)>='A' && this.texto.charAt(i)<='Z'){
                for(;i<this.texto.length() && i<this.texto.length() && this.texto.charAt(i)!=' ' && this.texto.charAt(i)!='\n';i++)
                    {aux=aux+this.texto.charAt(i);}
                contpal++;
                fin=aux;
                if(i<this.texto.length() && this.texto.charAt(i)==' '){                    
                    for(;i<this.texto.length() && (this.texto.charAt(i)==' ' || this.texto.charAt(i)=='x');i++){}
                    aux=aux+" ";
                }
                else    b=false; // hemos encontrado /n
                }
            else    b=false; // hemos encontado palabra en min
        }  
        if (contpal>1){
            this.indice=i;
            this.listadobiwords.addElement(aux);
        }             
     }

//Modificadoras

     private void subsNoFuncional(){
    //{Pre: cierto}j
    //{Post sustituye del texto las palabras funcionales por x y elimina los signos de puntuacion y acentos}
        int i;
        String actual="";
        char[] spunt={'.',',',':',';','¡','!','(',')'};
        char[] nacc={'A','E','I','O','U','a','e','i','o','u'};
        char[] acc={'À','Á','È','É','Í','Ï','Ò','Ó','Ú','Ü','à','á','è','é','í','ï','ò','ó','ú','ü'};
        for(int j=0; j<spunt.length;j++){
            this.texto=this.texto.replace(spunt[j],'\n');
        }
        for(i=0;i<acc.length;i++){
            this.texto=this.texto.replace(acc[i],nacc[i/2]);
        }
        for(i=0;i<this.texto.length();i++){
            if(this.texto.charAt(i)==' ' || this.texto.charAt(i)=='\n'){
                if(this.esFuncional(actual)==true){
                    this.texto=this.texto.replaceFirst(" "+actual+" "," x ");
                    i=i-(actual.length()+1);
                }
                actual="";
            }
                else    actual=actual+this.texto.charAt(i);
        }         
    }
    
    private boolean esFuncional(String p){
        boolean b;
        p=p.toLowerCase();
        b=(FNC.existPalabra(p)!=0);
        return b;
    }

    private void tknFuncional(){
    //{Pre: el parametro implicito no contiene palabras funcionales}
    //{Post: convierte palabras funcinales en su raíz}
        for(this.indice=0;this.indice<this.texto.length();this.indice++){
            this.isBiword();
         }
        this.texto=this.texto.toLowerCase();
        int i=0;
        while(i<this.texto.length()){
            String aux="";
            for(;i<this.texto.length() && this.texto.charAt(i)!=' ' && this.texto.charAt(i)!='\n' && this.texto.charAt(i)!='x';i++)
                    {aux=aux+this.texto.charAt(i);}
            if(!aux.equals("")){
                aux=tknpal(aux);
                this.listadopalabras.addElement(aux);
            }
            if(i<this.texto.length() && (this.texto.charAt(i)==' ' || this.texto.charAt(i)=='x'))
                    for(;i<this.texto.length() && (this.texto.charAt(i)==' ' || this.texto.charAt(i)=='x');i++){}
             
         }
    }
    
    private String tknpal(String p){
        p=p+" ";
        String[] suff={"os","a","as","ar","er","ir","ante","iente","ente","or","ora"};
        boolean b;
        int i;
        for(i=0,b=false;!b && i<suff.length;i++){
            if(p.endsWith(suff[i]) && (p.length()>(suff[i].length()+3))){
                p=p.replaceFirst(suff[i]+" ","");
                b=true;
            }
        }
        return p;             
    }
    
    public Vector<String> consultarClaves(){
        return this.listadopalabras;
    }
    
    public String consultarTexto(){
        return this.texto;
    }
    
    public Vector<String> consultarBiClaves(){
        return this.listadobiwords;
    }
    
 }
